
#ifndef OperatingSystem_h
#define OperatingSystem_h

#include <Typedef.h>
#include <CSharpPropertyMethods.h>
#include <Defines.h>

#include <REvents.h>
#include <System/EventArgs.h>
#include <System/String.h>
#include <System/Version.h>
#include <System/PlatformID.h>

// Not implemented.
namespace Riccsson
{
	namespace System
	{
		namespace Runtime
		{
			namespace Serialization
			{
				class SerializationInfo;
				struct StreamingContext{};
			}
		}
	}
}

namespace Riccsson
{
	namespace System
	{
		// Summary:
		//     Represents information about an operating system, such as the version and
		//     platform identifier. This class cannot be inherited.
		class OperatingSystem sealed
			: public ICloneable
			//, public: ISerializable
		{
			PROP3GET(OperatingSystem, PlatformID, Platform)
			PROP3GET(OperatingSystem, GC_PTR<string>, ServicePack)
			PROP3GET(OperatingSystem, GC_PTR<Version>, version)
			PROP3GET(OperatingSystem, GC_PTR<string>, VersionString)

			COPY_CONSTRUCTOR(OperatingSystem)
			{
				PROP3GET_INIT_COPY(OperatingSystem, PlatformID, Platform);
				PROP3GET_INIT_COPY(OperatingSystem, GC_PTR<string>, ServicePack);
				PROP3GET_INIT_COPY(OperatingSystem, GC_PTR<Version>, version);
				PROP3GET_INIT_COPY(OperatingSystem, GC_PTR<string>, VersionString);
			}

			// Summary:
			//     Initializes a new instance of the System.OperatingSystem class, using the
			//     specified platform identifier value and version object.
			//
			// Parameters:
			//   platform:
			//     One of the System.PlatformID values that indicates the operating system platform.
			//
			//   version:
			//     A System.Version object that indicates the version of the operating system.
			//
			// Exceptions:
			//   System.ArgumentNullException:
			//     version is null.
			//
			//   System.ArgumentException:
			//     platform is not a System.PlatformID enumeration value.
			public: OperatingSystem(PlatformID platform, Version* version)
				: PROP3GET_INIT(OperatingSystem, Platform)
				, PROP3GET_INIT(OperatingSystem, ServicePack)
				, PROP3GET_INIT(OperatingSystem, version)
				, PROP3GET_INIT(OperatingSystem, VersionString)
			{
				throw;
			}

			// Summary:
			//     Gets a System.PlatformID enumeration value that identifies the operating
			//     system platform.
			//
			// Returns:
			//     One of the System.PlatformID values.
			public: PROP3_GET(PlatformID, Platform)
			{
				throw;
			}

			//
			// Summary:
			//     Gets the service pack version represented by this System.OperatingSystem
			//     object.
			//
			// Returns:
			//     The service pack version, if service packs are supported and at least one
			//     is installed; otherwise, an empty string ("").
			public: PROP3_GET(GC_PTR<string>, ServicePack)
			{
				throw;
			}

			//
			// Summary:
			//     Gets a System.Version object that identifies the operating system.
			//
			// Returns:
			//     A System.Version object that describes the major version, minor version,
			//     build, and revision numbers for the operating system.
			public: PROP3_GET(GC_PTR<Version>, version)
			{
				throw;
			}

			//
			// Summary:
			//     Gets the concatenated string representation of the platform identifier, version,
			//     and service pack that are currently installed on the operating system.
			//
			// Returns:
			//     The string representation of the values returned by the System.OperatingSystem.Platform,
			//     System.OperatingSystem.Version, and System.OperatingSystem.ServicePack properties.
			public: PROP3_GET(GC_PTR<string>, VersionString)
			{
				throw;
			}

			// Summary:
			//     Creates an System.OperatingSystem object that is identical to this instance.
			//
			// Returns:
			//     An System.OperatingSystem object that is a copy of this instance.
			public: GC_PTR<object> Clone()
			{
				throw;
			}

			//
			// Summary:
			//     Populates a System.Runtime.Serialization.SerializationInfo object with the
			//     data necessary to deserialize this instance.
			//
			// Parameters:
			//   info:
			//     The object to populate with serialization information.
			//
			//   context:
			//     The place to store and retrieve serialized data. Reserved for future use.
			//
			// Exceptions:
			//   System.ArgumentNullException:
			//     info is null.
			public: void GetObjectData(Runtime::Serialization::SerializationInfo* info, Runtime::Serialization::StreamingContext context)
			{
				throw;
			}

			//
			// Summary:
			//     Converts the value of this System.OperatingSystem object to its equivalent
			//     string representation.
			//
			// Returns:
			//     The string representation of the values returned by the System.OperatingSystem.Platform,
			//     System.OperatingSystem.Version, and System.OperatingSystem.ServicePack properties.
			public: override GC_PTR<string> ToString()
			{
				throw;
			}
		};
	}
}

#endif